home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
ms_dos
/
tool
/
fwcp
/
src
/
scrn.c
< prev
next >
Wrap
Text File
|
1995-03-31
|
19KB
|
859 lines
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#ifdef MSDOS
#include <jctype.h>
#include <dos.h>
#else
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/termio.h>
#include <sys/tty.h>
#endif
#include "defs.h"
typedef struct {
char at;
char ch;
} VRAM;
static VRAM *vram = NULL;
static VRAM *dram = NULL;
static VRAM *sram = NULL;
static char tc_ent[2048];
static char tc_buf[2048];
static int R7;
static char *CD, *CE, *CL,
*CM, *HO, *LL,
*LE, *ND, *DO, *UP,
*DC, *IC, *DL, *AL,
*MB, *MD, *MR,
*ME, *SA,
*SO, *SX, *SM, *SE,
*SF, *SR,
*VB,
*VI, *VE;
int lines_max = 0;
int cols_max = 0;
static int lines_sys = 0;
static int now_at = 0;
static int now_x = 0;
static int now_y = 0;
static int scr_ofs = 0;
static int cur_dsp = TRUE;
static int back_x, back_y;
static int save_flag = FALSE;
char *getenv();
char *tgetstr();
char *tgoto();
void setkey();
void SYSLINE();
static struct {
int code;
char *cap;
} key_tab[] = {
{ 0x8001, "k1" }, /* PF1 */
{ 0x8002, "k2" }, /* PF2 */
{ 0x8003, "k3" }, /* PF3 */
{ 0x8004, "k4" }, /* PF4 */
{ 0x8005, "k5" }, /* PF5 */
{ 0x8006, "k6" }, /* PF6 */
{ 0x8007, "k7" }, /* PF7 */
{ 0x8008, "k8" }, /* PF8 */
{ 0x8009, "k9" }, /* PF9 */
{ 0x800A, "k;" }, /* PF10 */
{ 0x800B, "F1" }, /* PF11 */
{ 0x800C, "F2" }, /* PF12 */
{ 0x800D, "F3" }, /* PF13 */
{ 0x800E, "F4" }, /* PF14 */
{ 0x800F, "F5" }, /* PF15 */
{ 0x8010, "F6" }, /* PF16 */
{ 0x8011, "F7" }, /* PF17 */
{ 0x8012, "F8" }, /* PF18 */
{ 0x8013, "F9" }, /* PF19 */
{ 0x8014, "F;" }, /* PF20 */
{ 0x001C, "kr" }, /* RIGHT */
{ 0x001D, "kl" }, /* LEFT */
{ 0x001E, "ku" }, /* UP */
{ 0x001F, "kd" }, /* DOWN */
{ 0x007F, "kD" }, /* DEL */
{ 0x0000, NULL },
};
static int tput_len = 0;
static char tput_buf[512];
static void tflush()
{
#ifdef MSDOS
char far *p;
union REGS reg;
struct SREGS seg;
p = tput_buf;
reg.h.ah = 0x1E;
reg.x.cx = tput_len;
seg.ds = FP_SEG(p);
reg.x.di = FP_OFF(p);
int86x(0x91, ®, ®, &seg);
tput_len = 0;
#else
fflush(stdout);
#endif
}
static void tputc(int code)
{
#ifdef MSDOS
if ( tput_len >= 512 )
tflush();
tput_buf[tput_len++] = code;
#else
putchar(code);
#endif
}
int SCRNINIT(char *ent)
{
int n;
char *term;
char *ptr = tc_buf;
char *p, *s;
#ifndef MSDOS
struct winsize winsize;
#endif
if ( (term = ent) == NULL && (term = getenv("TERM")) == NULL )
return ERR;
if ( tgetent(tc_ent, term) < 0 )
return ERR;
#ifdef MSDOS
lines_max = tgetnum("li");
cols_max = tgetnum("co");
if ( (p = getenv("LINES")) != NULL )
lines_max = atoi(p);
if ( (p = getenv("COLS")) != NULL )
cols_max = atoi(p);
#else
if( ioctl(1, TIOCGWINSZ, &winsize) != -1 ) {
lines_max = winsize.ws_row;
cols_max = winsize.ws_col;
} else {
lines_max = tgetnum("li");
cols_max = tgetnum("co");
if ( (p = getenv("LINES")) != NULL )
lines_max = atoi(p);
if ( (p = getenv("COLUMNS")) != NULL )
cols_max = atoi(p);
if ( (p = getenv("COLS")) != NULL )
cols_max = atoi(p);
}
#endif
if ( lines_max <= 0 || lines_max >= 160 )
lines_max = 24;
if ( cols_max <= 0 || cols_max >= LINSIZ )
cols_max = 80;
lines_sys = lines_max - 1;
#ifndef MSDOS
lines_max--;
#endif
CD = tgetstr("cd", &ptr); /* Clear to end of display. */
CE = tgetstr("ce", &ptr); /* Clear to end of line. */
CL = tgetstr("cl", &ptr); /* Clear screen and home cursor */
CM = tgetstr("cm", &ptr); /* Screen-relative cursor motion*/
HO = tgetstr("ho", &ptr); /* Home cursor. */
LL = tgetstr("ll", &ptr); /* Last line, first column */
LE = tgetstr("le", &ptr); /* Move cursor left one pos. */
ND = tgetstr("nd", &ptr); /* Move cursor right one pos. */
DO = tgetstr("do", &ptr); /* Down one line. */
UP = tgetstr("up", &ptr); /* Up one line. */
DC = tgetstr("dc", &ptr); /* Delete character */
IC = tgetstr("ic", &ptr); /* Insert character */
DL = tgetstr("dl", &ptr); /* Delete line. */
AL = tgetstr("al", &ptr); /* Add new blank line. */
MB = tgetstr("mb", &ptr); /* Turn on blinking attribute. */
MD = tgetstr("md", &ptr); /* Turn on bold attribute. */
MR = tgetstr("mr", &ptr); /* Turn on reverse attibute. */
ME = tgetstr("me", &ptr); /* Turn off all attributes. */
SA = tgetstr("sa", &ptr); /* Define the video attributes. */
SO = tgetstr("so", &ptr); /* Begin standout mode. */
SX = tgetstr("sx", &ptr); /* Begin error mode. */
SM = tgetstr("sm", &ptr); /* Begin message mode. */
SE = tgetstr("se", &ptr); /* End standout mode. */
SF = tgetstr("sf", &ptr); /* Scroll text up. */
SR = tgetstr("sr", &ptr); /* Scroll text down. */
VB = tgetstr("vb", &ptr); /* Visible bell */
VI = tgetstr("vi", &ptr); /* Cursor Display Off */
VE = tgetstr("ve", &ptr); /* Cursor Display On */
R7 = tgetflag("r7"); /* FMR70 Ext Kanji Code */
for ( n = 0 ; key_tab[n].cap != NULL ; n++ ) {
s = ptr;
if ( (p = tgetstr(key_tab[n].cap, &s)) != NULL )
setkey(key_tab[n].code, p);
}
if ( CL == NULL || CM == NULL || CE == NULL )
return ERR;
if ( (vram = (VRAM *)malloc(sizeof(VRAM)*cols_max*lines_max)) == NULL ||
(dram = (VRAM *)malloc(sizeof(VRAM)*cols_max*lines_max)) == NULL ||
(sram = (VRAM *)malloc(sizeof(VRAM)*cols_max*lines_max)) == NULL )
return ERR;
memset(vram, 0, sizeof(VRAM) * cols_max * lines_max);
memset(dram, 0, sizeof(VRAM) * cols_max * lines_max);
tputs(CL, 1, tputc);
tflush();
cur_dsp = TRUE;
return FALSE;
}
void FLUSH()
{
int n, i;
int x, y;
int sx = (-1);
int sy = (-1);
int at = 0;
VRAM *vp, *dp;
vp = vram;
dp = dram;
if ( cur_dsp == TRUE && VI != NULL )
tputs(VI, 1, tputc);
if ( scr_ofs > 0 && scr_ofs < (lines_max / 2) ) {
memcpy(&(dram[0 * cols_max]),
&(dram[scr_ofs * cols_max]),
sizeof(VRAM) * (lines_max - scr_ofs) * cols_max);
memset(&(dram[(lines_max - scr_ofs) * cols_max]), 0,
sizeof(VRAM) * scr_ofs * cols_max);
tputs((HO != NULL ? HO : tgoto(CM, 0, 0)), 1, tputc);
while ( scr_ofs-- > 0 )
tputs(DL, 1, tputc);
if ( lines_max == lines_sys )
SYSLINE(NULL);
} else if ( scr_ofs < 0 && (0 - scr_ofs) < (lines_max / 2) ) {
for ( y = lines_max - 1 ; y >= (0 - scr_ofs) ; y-- )
memcpy(&(dram[y * cols_max]),
&(dram[(y + scr_ofs) * cols_max]), sizeof(VRAM) * cols_max);
memset(&(dram[0 * cols_max]), 0,
sizeof(VRAM) * (0 - scr_ofs) * cols_max);
tputs((HO != NULL ? HO : tgoto(CM, 0, 0)), 1, tputc);
while ( scr_ofs++ < 0 )
tputs(AL, 1, tputc);
if ( lines_max == lines_sys )
SYSLINE(NULL);
}
scr_ofs = 0;
#if 1
for ( y = 0 ; y < lines_max ; y++ ) {
for ( x = 0 ; x < cols_max ; x++ ) {
if ( vp->ch != dp->ch || vp->at != dp->at ) {
if ( (vp->at & 0x40) != 0 ) {
x--; vp--; dp--;
if ( (vp->at & 0x80) == 0 ) {
x++; vp++; dp++;
vp->at &= 0xBF;
}
}
if ( sx != x || sy != y ) {
if ( sy == y && (sx + 5) >= x && ND != NULL ) {
while ( sx++ < x )
tputs(ND, 1, tputc);
} else
tputs(tgoto(CM, x, y), 1, tputc);
sx = x;
sy = y;
}
if ( (vp->at & 0x3F) != at ) {
n = vp->at & 0x3F;
if ( (at & 0x07) != 0 && ME != NULL ) {
at = 0;
tputs(ME, 1, tputc);
}
if ( (n & 0x01) != 0 && MB != NULL && ME != NULL )
tputs(MB, 1, tputc);
if ( (n & 0x02) != 0 && MD != NULL && ME != NULL )
tputs(MD, 1, tputc);
if ( (n & 0x04) != 0 && MR != NULL && ME != NULL )
tputs(MR, 1, tputc);
if ( (n & 0x38) != (at & 0x38) ) {
switch(n & 0x18) {
case 0x00:
if ( SE != NULL )
tputs(SE, 1, tputc);
break;
case 0x08:
if ( SO != NULL )
tputs(SO, 1, tputc);
break;
case 0x10:
if ( SX != NULL )
tputs(SX, 1, tputc);
break;
case 0x18:
if ( SM != NULL )
tputs(SM, 1, tputc);
break;
}
}
at = n;
}
if ( (vp[0].at & 0x80) != 0 && (vp[1].at & 0x40) != 0 ) {
tputc(vp[0].ch);
tputc(vp[1].ch);
dp->at = vp->at; dp->ch = vp->ch; vp++; dp++;
dp->at = vp->at; dp->ch = vp->ch; vp++; dp++;
sx+=2;
x++;
} else {
if ( vp->ch == 0 && CE != NULL &&
memcmp(vp, vp + 1,
sizeof(VRAM) * (cols_max - x - 1)) == 0 ) {
tputs(CE, 1, tputc);
n = cols_max - x;
memcpy(dp, vp, sizeof(VRAM) * n);
x += n;
vp += n;
dp += n;
} else {
n = (vp->ch == 0 ? ' ':vp->ch) & 0xFF;
#ifdef MSDOS
if ( n < ' ' || iskanji(n) )
tputc(033);
#endif
tputc(n);
dp->at = vp->at;
dp->ch = vp->ch;
vp++;
dp++;
sx++;
}
}
} else {
vp++;
dp++;
}
}
}
#else
for ( y = 0 ; y < lines_max ; y++ ) {
vp = &(vram[y * cols_max]);
dp = &(dram[y * cols_max]);
for ( x = 0 ; x < cols_max ; x++ ) {
if ( vp[x].ch != dp[x].ch || vp[x].at != dp[x].at )
break;
}
if ( x >= cols_max )
continue;
for ( i = cols_max - 1 ; i > x ; i-- ) {
if ( vp[i].ch != dp[i].ch || vp[i].at != dp[i].at )
break;
}
vp += x;
dp += x;
tputs(tgoto(CM, x, y), 1, tputc);
for ( ; x <= i ; x++ ) {
if ( (vp->at & 0x40) != 0 ) {
x--; vp--; dp--;
if ( (vp->at & 0x80) == 0 ) {
x++; vp++; dp++;
vp->at &= 0xBF;
}
}
if ( (vp->at & 0x0F) != at ) {
n = vp->at & 0x0F;
if ( (at & 0x07) != 0 && ME != NULL ) {
at = 0;
tputs(ME, 1, tputc);
}
if ( (n & 0x01) != 0 && MB != NULL && ME != NULL )
tputs(MB, 1, tputc);
if ( (n & 0x02) != 0 && MD != NULL && ME != NULL )
tputs(MD, 1, tputc);
if ( (n & 0x04) != 0 && MR != NULL && ME != NULL )
tputs(MR, 1, tputc);
if ( (n & 0x08) != (at & 0x08) &&
SO != NULL && SE != NULL )
tputs(((n & 0x08) ? SO : SE), 1, tputc);
at = n;
}
if ( (vp[0].at & 0x80) != 0 && (vp[1].at & 0x40) != 0 ) {
tputc(vp[0].ch);
tputc(vp[1].ch);
dp->at = vp->at; dp->ch = vp->ch; vp++; dp++;
dp->at = vp->at; dp->ch = vp->ch; vp++; dp++;
x++;
} else {
n = (vp->ch == 0 ? ' ':vp->ch) & 0xFF;
#ifdef MSDOS
if ( n < ' ' || iskanji(n) )
tputc(033);
#endif
tputc(n);
dp->at = vp->at; dp->ch = vp->ch; vp++; dp++;
}
}
}
#endif
if ( (at & 0x07) != 0 && ME != NULL )
tputs(ME, 1, tputc);
if ( (at & 0x08) != 0 && SE != NULL )
tputs(SE, 1, tputc);
tputs(tgoto(CM, now_x, now_y), 1, tputc);
if ( cur_dsp == TRUE && VE != NULL )
tputs(VE, 1, tputc);
tflush();
}
void REFLUSH()
{
memset(dram, 0xFF, sizeof(VRAM) * (cols_max * lines_max - 1));
}
void SAVESCREEN()
{
if ( save_flag == FALSE )
memcpy(sram, vram, sizeof(VRAM) * cols_max * lines_max);
save_flag = TRUE;
}
void LOADSCREEN()
{
memcpy(vram, sram, sizeof(VRAM) * cols_max * lines_max);
save_flag = FALSE;
}
void SAVECUR()
{
back_x = now_x;
back_y = now_y;
}
void LOADCUR()
{
now_x = back_x;
now_y = back_y;
}
void PUTANK(int ch)
{
if ( ch == 0x20 )
ch = 0;
vram[now_x + now_y * cols_max].at = now_at;
vram[now_x + now_y * cols_max].ch = ch;
if ( ++now_x >= cols_max ) {
now_x = 0;
if ( ++now_y >= lines_max )
now_y = lines_max - 1;
}
}
void PUTC(int ch)
{
PUTANK(ch);
}
void PUTKAN(int ch)
{
int n;
static struct {
int jisR70;
int jis83;
} jistab[]={
{ 0xEF64, 0x84aa },
{ 0xEF65, 0x84ab },
{ 0xEF60, 0x84ac },
{ 0xEF61, 0x84ad },
{ 0xEF63, 0x84ae },
{ 0xEF62, 0x84af },
{ 0xEF88, 0x84a5 },
{ 0xEF89, 0x84a6 },
{ 0xEF8A, 0x84a7 },
{ 0xEF87, 0x84a8 },
{ 0xEF8B, 0x84a9 },
{ 0xEF85, 0x849f },
{ 0xEF86, 0x84a0 },
{ 0xEF81, 0x84a1 },
{ 0xEF82, 0x84a2 },
{ 0xEF84, 0x84a3 },
{ 0xEF83, 0x84a4 },
{ 0xEF67, 0x84b0 },
{ 0xEF68, 0x84b1 },
{ 0xEF69, 0x84b2 },
{ 0xEF66, 0x84b3 },
{ 0xEF6A, 0x84b4 },
{ 0xEF74, 0x84b5 },
{ 0xEF76, 0x84b6 },
{ 0xEF78, 0x84b7 },
{ 0xEF72, 0x84b8 },
{ 0xEF7A, 0x84b9 },
{ 0,0 }
};
if ( R7 != TRUE ) {
for ( n = 0 ; jistab[n].jisR70 != 0 ; n++ ) {
if ( ch == jistab[n].jisR70 ) {
ch = jistab[n].jis83;
break;
}
}
}
if ( (now_x + 2) > cols_max ) {
now_x = 0;
if ( ++now_y >= lines_max )
now_y = lines_max - 1;
}
vram[now_x + now_y * cols_max].at = now_at | 0x80;
vram[now_x + now_y * cols_max].ch = ch >> 8;
now_x++;
vram[now_x + now_y * cols_max].at = now_at | 0x40;
vram[now_x + now_y * cols_max].ch = ch & 0xFF;
now_x++;
if ( now_x >= cols_max ) {
now_x = 0;
if ( ++now_y >= lines_max )
now_y = lines_max - 1;
}
}
void PUTS(char *str)
{
while ( *str != '\0' ) {
if ( iskanji(str[0]) && iskanji2(str[1]) ) {
PUTKAN(((str[0] & 0xFF) << 8) | (str[1] & 0xFF));
str += 2;
} else
PUTANK(*(str++));
}
}
void FPUTS(char *form, ...)
{
va_list arg;
char tmp[128];
va_start(arg, form);
vsprintf(tmp, form, arg);
va_end(arg);
PUTS(tmp);
}
void LOCATE(int x, int y)
{
if ( (now_x = x) >= cols_max )
now_x = cols_max - 1;
else if ( now_x < 0 )
now_x = 0;
if ( (now_y = y) >= lines_max )
now_y = lines_max - 1;
else if ( now_y < 0 )
now_y = 0;
}
void TOPSCR()
{
now_x = now_y = 0;
}
void BTMSCR()
{
now_x = 0;
now_y = lines_max - 1;
}
void INSLINE()
{
int y;
for ( y = lines_max - 1 ; y > now_y ; y-- )
memcpy(&(vram[y * cols_max]),
&(vram[(y - 1) * cols_max]), sizeof(VRAM) * cols_max);
memset(&(vram[now_y * cols_max]), 0, sizeof(VRAM) * cols_max);
}
void DELLINE()
{
int y;
for ( y = now_y ; y < (lines_max - 1) ; y++ )
memcpy(&(vram[y * cols_max]),
&(vram[(y + 1) * cols_max]), sizeof(VRAM) * cols_max);
memset(&(vram[(lines_max - 1) * cols_max]), 0, sizeof(VRAM) * cols_max);
}
void FORSCROOL()
{
int y;
for ( y = 0 ; y < (lines_max - 1) ; y++ )
memcpy(&(vram[y * cols_max]),
&(vram[(y + 1) * cols_max]), sizeof(VRAM) * cols_max);
memset(&(vram[(lines_max - 1) * cols_max]), 0, sizeof(VRAM) * cols_max);
scr_ofs++;
}
void BAKSCROOL()
{
int y;
for ( y = lines_max - 1 ; y > 0 ; y-- )
memcpy(&(vram[y * cols_max]),
&(vram[(y - 1) * cols_max]), sizeof(VRAM) * cols_max);
memset(&(vram[0 * cols_max]), 0, sizeof(VRAM) * cols_max);
scr_ofs--;
}
void CLS()
{
memset(vram, 0, sizeof(VRAM) * cols_max * lines_max);
now_x = now_y = 0;
}
void ERALINE()
{
memset(&(vram[now_x + now_y * cols_max]), 0,
sizeof(VRAM) * (cols_max - now_x));
}
void ERASCR()
{
int y;
ERALINE();
for ( y = now_y + 1 ; y < lines_max ; y++ )
memset(&(vram[y * cols_max]), 0, sizeof(VRAM) * cols_max);
}
void BAKSPC(int n)
{
if ( (now_x -= n) < 0 )
now_x = 0;
}
void ATTSET(int n)
{
while ( n-- > 0 ) {
vram[now_x + now_y * cols_max].at &= 0xC0;
vram[now_x + now_y * cols_max].at |= now_at;
if ( ++now_x >= cols_max ) {
now_x = 0;
if ( ++now_y >= lines_max )
now_y = lines_max - 1;
}
}
}
void BLINKCOL()
{
now_at |= 0x01;
}
void BOLDCOL()
{
now_at |= 0x02;
}
void REVCOL()
{
now_at |= 0x04;
}
void NOMCOL()
{
now_at &= 0x38;
}
void ACTCOL()
{
now_at &= 0x07;
now_at |= 0x08;
}
void ERRCOL()
{
now_at &= 0x07;
now_at |= 0x10;
}
void MSGCOL()
{
now_at &= 0x07;
now_at |= 0x18;
}
void STDCOL()
{
now_at &= 0x07;
}
void REPCHR(int ch, int n)
{
while ( n-- > 0 )
PUTANK(ch);
}
void CUROFF()
{
cur_dsp = FALSE;
if ( VI != NULL )
tputs(VI, 1, tputc);
tflush();
}
void CURON()
{
cur_dsp = TRUE;
if ( VE != NULL )
tputs(VE, 1, tputc);
tflush();
}
void BEEP()
{
if ( VB != NULL )
tputs(VB, 1, tputc);
else
tputc(0x07);
tflush();
}
#ifdef MSDOS
int jis2sjis(chr)
int chr;
{
int hi,lo;
hi = (chr >> 8) & 0xff;
lo = chr & 0xff;
if ( (hi & 1) != 0 )
lo += 0x1F;
else
lo += 0x7D;
if ( lo >= 0x7F )
lo++;
hi = (hi - 0x21 >> 1) + 0x81;
if ( hi > 0x9F )
hi += 0x40;
return (hi << 8 | lo);
}
int sjis2jis(cd)
int cd;
{
int hi,lo;
hi = (cd >> 8) & 0xff;
lo = cd & 0xff;
hi -= ( hi <= 0x9f) ? 0x71 : 0xb1;
hi = hi * 2 +1;
if ( lo > 0x7f )
lo--;
if ( lo >= 0x9e ) {
lo -= 0x7d;
hi++;
}
else
lo -= 0x1f;
return (hi << 8 | lo);
}
void SYSLINE(char *str)
{
int i,n;
char far *p;
union REGS regs;
struct SREGS seg;
static struct {
char far *chr;
char far *att;
} adr_tbl;
static struct {
char mode;
char attr;
short color;
} att_buf[80];
static char chr_buf[80];
memset(chr_buf, 0, 80);
memset(att_buf, 0, sizeof(att_buf));
n = 0;
while ( n < 80 && *str != '\0' ) {
if ( iskanji(*str) && iskanji2(*(str+1)) ) {
i = *(str++) << 8;
i |= (*(str++) & 0xFF);
i = sjis2jis(i);
chr_buf[n] = (i >> 8);
att_buf[n].mode = 1;
att_buf[n].attr = 0;
att_buf[n].color = 7;
n++;
chr_buf[n] = (i & 0xFF);
att_buf[n].mode = 3;
att_buf[n].attr = 0;
att_buf[n].color = 7;
n++;
} else {
chr_buf[n] = *(str++);
att_buf[n].mode = 0;
att_buf[n].attr = 0;
att_buf[n].color = 7;
n++;
}
}
adr_tbl.chr = (char far *)chr_buf;
adr_tbl.att = (char far *)att_buf;
p = (char far *)(&adr_tbl);
regs.h.ah = 0x1F;
regs.h.al = 1;
regs.x.cx = 60;
regs.h.dl = 1;
seg.ds = FP_SEG(p);
regs.x.di = FP_OFF(p);
int86x(0x91,®s,®s,&seg);
}
#else
void SYSLINE(char *str)
{
static char *now = "";
if ( str == NULL )
str = now;
now = str;
tputs(tgoto(CM, 0, lines_sys), 1, tputc);
while ( *str != '\0' )
tputc(*(str++));
tputs(CE, 1, tputc);
tflush();
}
#endif
void SCRNEND()
{
SYSLINE("");
tputs(tgoto(CM, 0, lines_sys), 1, tputc);
tputs(CE, 1, tputc);
tflush();
}